// utils/converter.js

// 长度单位换算基准(以米为基准)
const LENGTH_UNITS = {
  'mm': 0.001,
  'cm': 0.01,
  'm': 1,
  'km': 1000,
  'in': 0.0254,
  'ft': 0.3048,
  'yd': 0.9144,
  'mi': 1609.344
};

// 面积单位换算基准(以平方米为基准)
const AREA_UNITS = {
  'mm2': 0.000001,
  'cm2': 0.0001,
  'm2': 1,
  'ha': 10000,
  'km2': 1000000,
  'in2': 0.00064516,
  'ft2': 0.092903,
  'yd2': 0.836127,
  'ac': 4046.86,
  'mi2': 2589988.11
};

// 重量单位换算基准(以克为基准)
const WEIGHT_UNITS = {
  'mg': 0.001,
  'g': 1,
  'kg': 1000,
  't': 1000000,
  'oz': 28.3495,
  'lb': 453.592
};

// 温度单位换算基准
const TEMPERATURE_UNITS = {
  'c': '摄氏度',
  'f': '华氏度',
  'k': '开尔文'
};

/**
 * 长度单位换算
 * @param {number} value - 要换算的数值
 * @param {string} fromUnit - 源单位
 * @param {string} toUnit - 目标单位
 * @returns {number} 换算结果
 */
function convertLength(value, fromUnit, toUnit) {
  // 将源单位转换为基准单位(米)
  const valueInMeter = value * LENGTH_UNITS[fromUnit];
  // 将基准单位转换为目标单位
  const result = valueInMeter / LENGTH_UNITS[toUnit];
  return result;
}

/**
 * 面积单位换算
 * @param {number} value - 要换算的数值
 * @param {string} fromUnit - 源单位
 * @param {string} toUnit - 目标单位
 * @returns {number} 换算结果
 */
function convertArea(value, fromUnit, toUnit) {
  // 将源单位转换为基准单位(平方米)
  const valueInSquareMeter = value * AREA_UNITS[fromUnit];
  // 将基准单位转换为目标单位
  const result = valueInSquareMeter / AREA_UNITS[toUnit];
  return result;
}

/**
 * 重量单位换算
 * @param {number} value - 要换算的数值
 * @param {string} fromUnit - 源单位
 * @param {string} toUnit - 目标单位
 * @returns {number} 换算结果
 */
function convertWeight(value, fromUnit, toUnit) {
  // 将源单位转换为基准单位(克)
  const valueInGram = value * WEIGHT_UNITS[fromUnit];
  // 将基准单位转换为目标单位
  const result = valueInGram / WEIGHT_UNITS[toUnit];
  return result;
}

/**
 * 温度单位换算
 * @param {number} value - 要换算的数值
 * @param {string} fromUnit - 源单位
 * @param {string} toUnit - 目标单位
 * @returns {number} 换算结果
 */
function convertTemperature(value, fromUnit, toUnit) {
  // 如果源单位和目标单位相同，直接返回原值
  if (fromUnit === toUnit) {
    return value;
  }
  
  // 先将源单位转换为摄氏度
  let valueInCelsius;
  switch (fromUnit) {
    case 'c': // 摄氏度
      valueInCelsius = value;
      break;
    case 'f': // 华氏度转摄氏度
      valueInCelsius = (value - 32) * 5/9;
      break;
    case 'k': // 开尔文转摄氏度
      valueInCelsius = value - 273.15;
      break;
    default:
      throw new Error(`不支持的温度单位: ${fromUnit}`);
  }
  
  // 将摄氏度转换为目标单位
  let result;
  switch (toUnit) {
    case 'c': // 摄氏度
      result = valueInCelsius;
      break;
    case 'f': // 摄氏度转华氏度
      result = valueInCelsius * 9/5 + 32;
      break;
    case 'k': // 摄氏度转开尔文
      result = valueInCelsius + 273.15;
      break;
    default:
      throw new Error(`不支持的温度单位: ${toUnit}`);
  }
  
  return result;
}

/**
 * 通用换算函数
 * @param {string} type - 换算类型('length'|'area'|'weight'|'temperature')
 * @param {number} value - 要换算的数值
 * @param {string} fromUnit - 源单位
 * @param {string} toUnit - 目标单位
 * @returns {number} 换算结果
 */
function convert(type, value, fromUnit, toUnit) {
  switch (type) {
    case 'length':
      return convertLength(value, fromUnit, toUnit);
    case 'area':
      return convertArea(value, fromUnit, toUnit);
    case 'weight':
      return convertWeight(value, fromUnit, toUnit);
    case 'temperature':
      return convertTemperature(value, fromUnit, toUnit);
    default:
      throw new Error(`不支持的换算类型: ${type}`);
  }
}

// 导出函数
module.exports = {
  convertLength,
  convertArea,
  convertWeight,
  convertTemperature,
  convert
};